perm filename RP0411.3[KL,SYS] blob sn#209160 filedate 1976-04-03 generic text, type T, neo UTF8
;;;MODIFICATION HISTORY
;;;
;;; 15 NOV 75  OBTAINED FROM DEC (KLDCP REV 7)
;;; 15 NOV 75  CONVERTED TO PALX FORMAT
;;;

.SBTTL	RP04 CONSOLE SELECTION, 5-AUG-75

$RP:	TTISDO 			;GET RP04 SELECTION DIGIT
	CMP R0,#7		;MUST BE 0 TO 7
	BLE 1$
	JMP $CMDE

1$:	MOV R0,RPUNIT		;SAVE
	MOV #1,DEVTYP		;SET RP04 MODE

	RPLOAD 			;INIT & LOAD PACK
	BCS $RPERR

2$:	JMP $KONSL

.SBTTL	RP04 FILE DIRECTORY LOOKUP

RPFIL:	RPFILE
	BCS 1$
	JMP DTRPLD
1$:	JMP $NONXF

$RPFILE:CLR RPEOF		;CLEAR END-OF-FILE
	ASCR50 			;CONVERT FILE.EXT TO RAD50
	  NAMBF
	  NAMRAD
	BCC 1$
	$PMSG 			;NAME.EXT ERR
	  $$NAM
	BR $RPERX

1$:	MOV #NAMRAD,R0
	MOV #FILDSB,R1
	RPLKUP 			;LOOK UP FILE IN DIRECTORY
	BCC 3$

	CMP #-24,R0
	BNE $RPERR
	EXITERR

3$:	EXIT

;RP04 ERROR REPORTER

$RPERR:	PUSH R0
	PMSG <?RP04 ERROR >
	POP R0
	NEG R0
	MOV R0,R1
	PNTOCS 			;PRINT ERROR STATUS WORD
	PNTCI
	", 
	DEC R1
	SL R1,1
	MOV RPERTB(R1),R0
	PNTAL 			;PRINT ERROR REASON
$RPERX:	JMP $CNTLC

RPERTB:	RPER1
	RPER2
	RPER3
	RPER4
	RPER5
	RPER6
	RPER7
	RPER10
	RPER11
	RPER12
	RPER13
	RPER14
	RPER15
	RPER16
	RPER17
	RPER20
	RPER21
	RPER22
	RPER23
	RPER24
	RPER25

;RP04 ERROR MESSAGES

RPER1:	.ASCIZ %UNIT #%
RPER2:	.ASCIZ %UNAVAIL%
RPER4:
RPER5:
RPER3:	.ASCIZ %DRV INIT%
RPER6:	.ASCIZ %HOME BLK RD%
RPER7:	.ASCIZ %NO HOME BLK%
RPER10:	.ASCIZ %FILE SYS NAME%
RPER11:	.ASCIZ %NO INDEX%
RPER12:	.ASCIZ %NO DIR FILE%
RPER13:	.ASCIZ %PAST EOF%
RPER20:
RPER14:	.ASCIZ %POS%
RPER15:	.ASCIZ %READ ERR%
RPER16:	.ASCIZ %ALLOC CNG%
RPER17:	.ASCIZ %BUFSIZ%
RPER21:	.ASCIZ %INSUFF ALLOC%
RPER22:	.ASCIZ %DIR REWRT%
RPER23:	.ASCIZ %DATA WRT%
RPER24:	.ASCIZ %EOF%
RPER25:	.ASCIZ %RAD50%
.EVEN

.SBTTL	RP04 FILE RENAME

;COMMAND IS:
;	RENM:FILE.EXT FILE1.EXT

$RE:	TTICHR
	CMPB #'N,R0
	BNE 1$
	TTICHR
	CMPB #'M,R0
	BEQ 2$
1$:	JMP $CMDER

2$:	TTITRM
	NAMEXT 			;SETUP CURRENT FILE NAME.EXT

	RPFILE 			;FIND AND SETUP FILE
	BCC 4$
	JMP $NONXF

4$:	NAMEXT 			;SETUP NEW FILE NAME.EXT

	ASCR50 			;CONVERT NEW FILE.EXT TO RAD50
	  NAMBF
	  NAMRAD
	 BCS 1$			;NAME.EXT ERROR

	MOV #WRTBAK,R5		;POINTER TO WRITE-BACK INFO TO R5

	MOV (R5)+,R4		;GET CORE ADDRESS OF FILE DESCRIPTOR
	MOV #NAMRAD,R3
	MOV (R3)+,(R4)+		;TRANSFER NEW RAD50 FILE NAME.EXT
	MOV (R3)+,(R4)+		;TO CURRENT FILE DESCRIPTOR BLOCK
	MOV (R3),(R4)

	MOV (R5)+,CYLNDR
	MOV (R5)+,TRKSCT

	RPWRIT 			;REWRITE DIRECTORY BLOCK
	 BCC 3$
	MOV #-22,R0
	RPERROR

3$:	JMP $CONSL

.SBTTL	ASCR50 ASCII TO RAD50 CONVERSION ROUTINE

;CALL:
;	ASCR50
;	  ASCII ADDRESS
;	  RAD50 ADDRESS
;NINE BYTES OF ASCII INPUT
;THREE WORDS OF RAD50 OUTPUT

$ASCR50:ADD #4,12(SP)		;RETURN OVER TRAILING PARAMETERS
	PUSH R0
	MOV $EMADR,R5
	MOV (R5)+,R1		;SETUP ASCII ADDRESS
	MOV (R5),R4		;SETUP RAD50 STORAGE ADDRESS
	MOV #066600,R3
1$:	CLR (R4)		;RESULT WORD
2$:	MOV #30$,R0		;SETUP SCAN TABLE
3$:	MOVB (R0)+,R2		;PUT CONVERSION IN R2
	BEQ 20$			;IF END OF TABLE, ERROR
	CMPB (R1),(R0)+		;COMPARE ASCII CHAR
	BLO 20$			;IF LESS THAN TABLE ENTRY, ERROR
	CMPB (R1),(R0)+
	BHI 3$			;LOOP, HAVEN'T FOUND YET
	MOVB (R1)+,R0		;FOUND, ASCII CHAR TO R0
	ADD R2,R0		;CONVERT
	ASL (R4)
	ASL (R4)
	ASL (R4)
	ADD (R4),R0
	ASL (R4)
	ASL (R4)
	ADD R0,(R4)
	ASL R3			;SHIFT RAD50 WORD COUNTER
	BMI 2$			;NOT DONE WITH THIS RAD50 YET
	BEQ 10$			;IF 0, ALL DONE
	TST (R4)+		;STEP TO NEXT RAD50 WORD
	BR 1$			;GO DO NEXT
10$:	POP R0
	EXIT
20$:	POP R0
	EXITERR

30$:	.BYTE -40,' ,' 		;SPACE
	.BYTE -11,'$,'$		;DOLLAR SIGN
	.BYTE -22,'.,'.		;PERIOD
	.BYTE -22,'0,'9		;DIGITS
	.BYTE -100,'A,'Z	;UPPER CASE LETTERS
;	.ENABL LC
	.BYTE -140,'a,'z	;LOWER CASE LETTERS
	.BYTE 0			;INDICATE THE END OF THE TABLE
	.EVEN

.SBTTL	RPLOAD RP04 LOAD PACK (READ HOME BLOCK) ROUTINE

$RPLOAD:RPINIT 			;INITIALIZE RP04
	BCS 10$

	MOV #-6,R5
	CLR CYLNDR
	MOV #1,TRKSCT
	MOV #DVBUF,BUFADR
	MOV #BLKSIZ,BUFSIZ
	MOV #-BLKSIZ,WRDCNT
	RPREAD 			;READ HOME BLOCK
	BCS 9$			;-6 ERROR
	DEC R5

;SAVE INFORMATION ABOUT THE INDEX FILE & FILE DIRECTORY

	MOV #DVBUF+<105.*2>,R1
	MOV #RPIXCY,R2
1$:	MOV (R1)+,(R2)+
	CMP R1,#DVBUF+<111.*2>
	BLO 1$

;CHECK THAT THIS IS REALLY THE HOME BLOCK

	CMP DVBUF,#105755	;LAST 16 BITS OF "HOM" IN SIXBIT
	BNE 9$			;-7, BRANCH IF NOT HOM BLOCK
	DEC R5

;CHECK THAT THIS PACK CONTAINS OUR FILE SYSTEM (KLFEDDCS)

	MOV #DVBUF+<98.*2>,R1
	MOV #FSNAME,R2
2$:	CMP (R1)+,(R2)+
	BNE 9$			;-10, BRANCH IF FILE SYSTEM NAME IS INCORRECT
	CMP R1,#DVBUF+<104.*2>
	BLO 2$
	DEC R5
	TST RPIXCY		;DOES INDEX FILE EXIST?
	BLE 9$			;-11, BRANCH IF INDEX FILE DOES NOT EXIST
	DEC R5
	TST RPFDCY		;DOES FILE DIRECTORY EXIST?
	BLE 9$			;-12, BRANCH IF FILE DIRECTORY DOES NOT EXIST
	EXIT 			;INDICATE SUCCESS

9$:	MOV R5,R0		;PUT ERROR CODE IN R0
10$:	SETFLG 			;INDICATE FAILURE
	  RPUNIT
11$:	EXITERR

FSNAME:	.ASCII /KLFEDDCS    /	;FILE SYSTEM NAME

.SBTTL	RPFIND FIND FILE IN RP04 DIRECTORY

;R0 = POINTER TO FILE NAME IN RAD50
;R1 = POINTER TO RETURN STORE BLOCK
;	CORE ADR OF FILE DESCRIPTOR BLOCK
;	CYLINDER NUMBER
;	TRACK/SECTOR NUMBER

$RPFIND:MOV R0,R4		;SAVE FILE NAME POINTER
	MOV R1,R5		;SAVE RETURN POINTER
	MOV #DVBUF,BUFADR
	MOV #-BLKSIZ,WRDCNT
	MOV #BLKSIZ,BUFSIZ
	MOV #FILDSB,R3		;SETUP FILE DESCRIPTOR POINTER
	MOV #RPFDCY,R2		;SETUP DIRECTORY START

	MOV (R2)+,4*2(R3)
	MOV (R2)+,5*2(R3)
	MOV (R2),R0		;CHANGE DIR BLOCK COUNT TO
	SHIFTL 			;WORD COUNT
	  8.
	MOV R0,9.*2(R3)
	CLR 8.*2(R3)

	MOV R3,R2
	ADD #FDESIZ*2,R2
	CLR (R2)+		;CLEAR CURRENT POSITION
	CLR (R2)

1$:	MOV R3,R0
	RPRDFL 			;READ DIRECTORY DATA BLOCK
	 BCS 4$			;ERROR

	MOV (R0)+,R2		;DATA BUFFER POSITION
	MOV (R0),R1		;BYTE COUNT

2$:	CMP (R2),(R4)		;COMPARE DIRECTORY ENTRY
	BNE 3$			;AND REQUESTED FILE
	CMP 1*2(R2),1*2(R4)
	BNE 3$
	CMP 2*2(R2),2*2(R4)
	BNE 3$			;NOT THIS ENTRY

	MOV R2,(R5)+		;RETURN CORE ADDRESS OF DESCRIPTOR BLOCK
	MOV CYLNDR,(R5)+	;RETURN CYLINDER NUMBER
	MOV TRKSCT,(R5)+	;RETURN TRACK/SECTOR NUMBERS
	EXIT 			;"SUCCESS" RETURN

3$:	ADD #FDESIZ*2,R2	;FINISHED THIS DIRECTORY BLOCK ?
	SUB #FDESIZ*2,R1
	BHI 2$			;NO
	BR 1$			;YES, GO READ NEXT

4$:	CMP #1,R0		;EOF ?
	BNE 5$			;NO, RETURN ERROR CODE
	MOV #-24,R0		;YES, RETURN EOF CODE
5$:	EXITERR

.SBTTL	RPLKUP RP04 FILE DIRECTORY LOOKUP ROUTINE

;R0/ POINTER TO FILENAME IN RAD50
;R1/ STORE ADDRESS FOR FILE DESCRIPTOR

;FILE DESCRIPTOR BLOCK
;	 0/ FILENAME
;	 1/   "
;	 2/ FILE EXT
;	 3/ CREATION DATE
;	 4/ PHYSICAL BLOCK NUMBER
;	 5/   "
;	 6/ NUMBER OF WORDS ALLOCATED
;	 7/  "
;	 8/ NUMBER OF WORDS WRITTEN
;	 9/  "
;	10/ PDP-11 LOAD ADDRESS
;	11/ PDP-11 START ADDRESS
;	12/ FILE TYPE & FILE STATUS
;	13/ CHECKSUM
;	14/ 0
;	15/ 0
;	16/ CURRENT POSITION
;	17/  "

$RPLKUP:MOV R1,R5		;SAVE FILE DESCRIPTOR POINTER
	MOV #WRTBAK,R1

	RPFIND 			;FIND FILE
	BCS 2$			;NOT THERE

	MOV #FDESIZ,R2		;TRANSFER FILE INFO
	MOV (R1),R1
1$:	MOV (R1)+,(R5)+		;TO FILE DESCRIPTOR BLOCK
	DEC R2
	BNE 1$

	CLR (R5)+		;SET CURRENT POSITION AT ZERO
	CLR (R5)+
	EXIT

2$:	EXITERR

.SBTTL	RPRDFL READ A FILE (ON THE RP04)

;R0 = POINTER TO FILE DESCRIPTOR

$RPRDFL:MOV R0,R2		;SETUP FILE DESCRIPTOR POINTER
	MOV R2,R4
	ADD #16.*2,R4		;R4 POINTS TO CURRENT POSITION BLOCK
	MOV BUFSIZ,R3		;BUFFER SIZE TO R3

	MOV 8.*2(R2),R0		;R0 = M.S. NUMBER OF WORDS WRITTEN
	MOV 9.*2(R2),R1		;R1 = L.S. NUMBER OF WORDS WRITTEN
	SUB 2(R4),R1		;R1 = L.S. NUMBER OF WORDS REMAINING
	SBC R0			;PROPAGATE THE "BORROW"
	SUB (R4),R0		;R0 = M.S. NUMBER OF WORDS REMAINING
	BLT 40$			;BRANCH IF PAST EOF (ERROR)

	BGT 10$			;BRANCH IF MORE THAN 2**16 WORDS REMAIN

	TST R1			;NOW LOOK AT L.S. # OF WORDS REMAINING
	BEQ 60$			;BRANCH IF AT EOF

	CMP R1,R3		;COMPARE REMAINING WORDS WITH "BUFSIZ"
	BHI 10$			;BRANCH IF REMAINING WORDS IS LARGER

	MOV R1,R3		;REMAINING WORDS IS SMALLER (OR EQUAL)
	BR 15$			;AVIOD TRUNCATING THE BUFFER SIZE

10$:	BIC #BLKSIZ-1,R3	;TRUNCATE TO A MULTIPLE OF THE BLOCK SIZE

15$:	BIT #BLKSIZ-1,2(R4)	;IS CURRENT POSITION A MULTIPLE OF BLOCK SIZE?
	BNE 50$			;BRANCH IF NOT A MULTIPLE OF BLOCK SIZE

	MOV 4*2(R2),CYLNDR	;CYLINDER NUMBER OF START OF FILE
	MOV 5*2(R2),TRKSCT	;TRACK,SECTOR OF START OF FILE
	MOV (R4),R2		;R2 = M.S. CURRENT POSITION
	SWAB R2
	BISB 3(R4),R2
	MOV R2,OFFSET

	RPADDR 			;COMPUTE BLOCK # TO BE READ

	NEG R3
	MOV R3,WRDCNT		;SETUP WORD COUNT
	NEG R3

	RPREAD 			;READ FILE DATA BLOCK
	BCS 70$			;READ ERROR

	ADD R3,2(R4)		;UPDATE L.S. CURRENT POSITION
	ADC (R4)		;PROPAGATE CARRY INTO M.S. CURRENT POSITION
	ASL R3			;CONVERT WORDS READ TO BYTES
75$:	MOV R3,$RPINFO+2	;AND STORE AS BYTE COUNT ARGUMENT
	MOV BUFADR,$RPINFO	;STORE BUFFER ADDRESS
	MOV #$RPINFO,R0
	EXIT

40$:	MOV #-13,R0		;WE SEEM TO BE PAST THE EOF
	BR 30$
50$:	MOV #-14,R0		;WE WERE POSITIONED AT A NON-MULTIPLE OF BLKSIZ
	BR 30$
60$:	MOV #1,R0		;WE WERE ALREADY AT EOF
	BR 30$
70$:	MOV #-15,R0		;INDICATE THAT NO DATA WAS READ
30$:	EXITERR

.SBTTL	RPWRFL WRITE A FILE (ON THE RP04)

;R0 = POINTER TO FILE DESCRIPTOR
;BUFADR = ADDRESS OF BUFFER
;BUFSIZ = NUMBER OF WORDS TO BE WRITTEN
;RPEOF = BIT15=0, DON'T WRITE EOF; BIT15=1, WRITE EOF

$RPWRFL:MOV R0,R2
	MOV 16.*2(R2),R0	;R0 = M.S. CURRENT POSITION
	MOV 17.*2(R2),R1	;R1 = L.S. CURRENT POSITION
	MOV BUFSIZ,R3
	BEQ 70$			;BRANCH IF THE WORD COUNT IS ZERO

	TST RPEOF		;WRITING AN EOF ?
	BMI 1$			;YES

	BIT #BLKSIZ-1,R3	;IS BUFSIZ A MULTIPLE OF BLKSIZ?
	BNE RPWER1		;BRANCH IF IT IS NOT A MULTIPLE

1$:	BIT #BLKSIZ-1,R1	;IS THE CURRENT POSITION A MULTIPLE?
	BNE RPWER2		;BRANCH IF IT IS NOT A MULTIPLE

	MOV R0,R4		;R4 = M.S. CURRENT POSITION
	ADD R3,R1		;R1 = L.S. NEW POSITION
	ADC R0			;R0 = M.S. NEW POSITION
	CMP 6.*2(R2),R0		;COMPARE WITH WORDS ALLOCATED
	BGT 5$			;BRANCH IF MORE WORDS ALLOCATED

	BLT RPWER3		;BRANCH IF NOT ENOUGH WORDS ALLOCATED

	CMP 7.*2(R2),R1		;ITS CLOSE, LOOK FURTHER
	BLO RPWER3		;BRANCH IF NOT ENOUGH WORDS ALLOCATED

5$:	SWAB R4
	BISB <17.*2>+1(R2),R4
	MOV R4,OFFSET
	MOV 4.*2(R2),CYLNDR ;CYLINDER NUMBER
	MOV 5.*2(R2),TRKSCT ;TRACK/SECTOR NUMBERS
	RPADDR
	NEG R3
	MOV R3,WRDCNT
	NEG R3

	RPWRIT 			;WRITE DATA BLOCK
	BCS RPWER5

	ADD R3,17.*2(R2)	;COMPUTE NEW CURRENT POSITION
	ADC 16.*2(R2)		;PROPAGATE CARRY
	MOV 17.*2(R2),9.*2(R2) ;SET EOF AT CURRENT POSITION
	MOV 16.*2(R2),8.*2(R2) ;(M.S. ALSO)

70$:	TST RPEOF		;ARE WE WRITING AN EOF
	BPL RPWEX		;NO
	MOV R2,R0
	MOV #WRTBAK,R1

	MOV #DVBUF,BUFADR
	MOV #-BLKSIZ,WRDCNT
	MOV #BLKSIZ,BUFSIZ

	MOV 2(R1),CYLNDR	;SETUP SAME DIRECTORY BLOCK
	MOV 4(R1),TRKSCT

	RPREAD 			;READ CURRENT FILE DIRECTORY BLOCK
	BCS RPWER4

	MOV (R1)+,R3
	CMP 6.*2(R2),6.*2(R3)
	BNE RPWER0		;BRANCH IF ALLOCATION IS DIFFERENT
	CMP 7.*2(R2),7.*2(R3)
	BNE RPWER0		;BRANCH IF ALLOCATION IS DIFFERENT

	MOV #FDESIZ,R4
71$:	MOV (R2)+,(R3)+
	DEC R4
	BNE 71$

	MOV (R1)+,CYLNDR
	MOV (R1)+,TRKSCT

	RPWRIT 			;REWRITE DIRECTORY
	BCS RPWER4

RPWEX:	EXIT 			;SUCCESSFUL COMPLETION WITH NO EOF

RPWER0:	MOV #-16,R0		;ATTEMPT TO CHANGE FILE'S ALLOCATION
	BR RPWERX
RPWER1:	MOV #-17,R0		;BUFSIZ IS NOT A MULTIPLE OF BLOCK SIZE
	BR RPWERX
RPWER2:	MOV #-20,R0		;CURRENT POS. IS NOT A MULTIPLE OF BLOCK SIZE
	BR RPWERX
RPWER3:	MOV #-21,R0		;INSUFFICIENT ALLOCATION TO COMPLETE THIS WRITE
	BR RPWERX
RPWER4:	MOV #-22,R0		;DIRECTORY REWRITE FAILURE
	BR RPWERX
RPWER5:	MOV #-23,R0		;DATA BLOCK WRITE FAILURE

RPWERX:	EXITERR

.SBTTL	RPINIT STORES UNIT NUMBER & TRIES TO SET VOLUME VALID

$RPINIT:MOV #-1,R0
	MOV RPUNIT,R2		;CHECK RP04 UNIT #
	BIT #-7-1,R2
	BNE 2$			;-1 ERROR, BAD

	DEC R0
	MOV RPRH11,R1
	MOV #RPCLR,RPCS2(R1)	;CLEAR RP04
	MOV R2,RPCS2(R1)	;SELECT
	BIT #RPDVA,(R1)		;IS DRIVE AVAILABLE ?
	BEQ 2$			;-2 ERROR, NO

	DEC R0
	MOV RPDS(R1),R2		;READ STATUS
	COM R2
	BIC #-<RPMOL!RPDPR!RPDRY>-1,R2
	BNE 2$			;-3 ERROR, DRIVE ERROR

	DEC R0
	MOV #RPPRST,(R1)	;SET READ-IN PRESET
1$:	TSTB (R1)		;WAIT FOR CONTROLLER READY
	BPL 1$

	BIT #<RPTRE!RPMCPE>,(R1)
	BNE 2$			;-4 ERROR, DRIVE ERROR

	DEC R0
	BIT #<RPATA!RPERR>,RPDS(R1)
	BNE 2$			;-5 ERROR, DRIVE ERROR

3$:	EXIT

2$:	BIS #100000,RPUNIT	;ERROR, FORCE RESELECT
	EXITERR

.SBTTL	RPBASE RETURN RP04 PARAMETER BLOCK BASE ADDRESS

$RPBASE:MOV #FILDSB,R0
	EXIT

.SBTTL	RPREAD & RPWRIT, RP04 READ & WRITE I/O ROUTINES

$RPWRIT:MOV #RPWTFN,R5		;SETUP WRITE FUNCTION
	CLR R4
	BR RPFUNC

$RPREAD:MOV #RPRDFN,R5		;SETUP READ FUNCTION
	MOV #10.,R4		;10 RETRIES

RPFUNC:	JSR PC,$PTTYC
	TST RPUNIT		;VALID UNIT ?
	BMI 2$			;NO

	MOV RPRH11,R1
5$:	MOV RPUNIT,RPCS2(R1)	;SELECT DRIVE
	BIT #RPDVA,(R1)		;IS DRIVE AVAILABLE ?
	BEQ 2$			;NO

	MOV RPDS(R1),R2		;CHECK DRIVE STATUS
	COM R2
	BIC #-<RPMOL!RPDPR!RPDRY!RPVV>-1,R2
	BNE 2$			;ERROR

	MOV CYLNDR,RPDC(R1)	;START DRIVE OPERATION
	MOV TRKSCT,RPDA(R1)
	MOV BUFADR,RPBA(R1)
	MOV WRDCNT,RPWC(R1)
	MOV R5,(R1)

1$:	BIT #<RPTRE!RPMCPE!RPRDY>,(R1)
	BEQ 1$			;WAIT FOR COMPLETION OR ERROR

	BIT #<RPTRE!RPMCPE>,(R1)
	BNE 2$			;ERROR

	BIT #<RPATA!RPERR>,RPCS2(R1)
	BNE 4$			;ERROR

3$:	EXIT 			;COMPLETED

2$:	EXITERR

4$:	DEC R4			;RETRY READ ERRORS, 10 TIMES
	BLE 2$			;HARD ERROR
	MOV #RPCLR,RPCS2(R1)	;CLEAR RP04
	BR 5$			;TRY AGAIN

.SBTTL	RPADDR ADDS OFFSET TO AN RP04 PHYSICAL ADDRESS

$RPADDR:MOV CYLNDR,R0		;SETUP INITIAL VALUES
	MOV TRKSCT,R1
	MOV OFFSET,R2

	MOVB R1,R3		;COMPUTE NEW POSITION
	CLRB R1
	SWAB R1
	ADD R3,R2
1$:	BPL 2$
	DEC R0
	ADD #19.*20.,R2
	BR 1$
2$:	SUB #19.*20.,R2
	BLT 3$
	INC R0
	BR 2$
3$:	ADD #19.*20.,R2
4$:	SUB #20.,R2
	BLT 5$
	INC R1
	BR 4$
5$:	ADD #20.,R2
6$:	SUB #19.,R1
	BLT 7$
	INC R0
	BR 6$
7$:	ADD #19.,R1
	SWAB R1
	BISB R2,R1

	MOV R0,CYLNDR		;RETURN NEW POSITION
	MOV R1,TRKSCT
	EXIT
ββ